targetScope = 'subscription'

metadata name = 'WAF-aligned'
metadata description = 'This instance deploys the module in alignment with the best-practices of the Azure Well-Architected Framework.'

// ========== //
// Parameters //
// ========== //

@description('Optional. The name of the resource group to deploy for testing purposes.')
@maxLength(90)
param resourceGroupName string = 'dep-${namePrefix}-maintenance.maintenanceconfigurations-${serviceShort}-rg'

@description('Optional. The location to deploy resources to.')
param resourceLocation string = deployment().location

@description('Optional. A short identifier for the kind of deployment. Should be kept short to not run into resource-name length-constraints.')
param serviceShort string = 'mmcwaf'

@description('Optional. A token to inject into the name of each resource.')
param namePrefix string = '#_namePrefix_#'

// ============ //
// Dependencies //
// ============ //

// General resources
// =================
resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = {
  name: resourceGroupName
  location: resourceLocation
}

// ============== //
// Test Execution //
// ============== //

@batchSize(1)
module testDeployment '../../../main.bicep' = [
  for iteration in ['init', 'idem']: {
    scope: resourceGroup
    name: '${uniqueString(deployment().name, resourceLocation)}-test-${serviceShort}-${iteration}'
    params: {
      name: '${namePrefix}${serviceShort}001'
      location: resourceLocation
      extensionProperties: {
        InGuestPatchMode: 'User'
      }
      tags: {
        'hidden-title': 'This is visible in the resource name'
        Environment: 'Non-Prod'
        Role: 'DeploymentValidation'
      }
      maintenanceScope: 'InGuestPatch'
      maintenanceWindow: {
        duration: '03:00'
        expirationDateTime: '9999-12-31 23:59:59'
        recurEvery: 'Day'
        startDateTime: '2022-12-31 13:00'
        timeZone: 'W. Europe Standard Time'
      }
      namespace: '${serviceShort}ns'
      visibility: 'Custom'
      installPatches: {
        linuxParameters: {
          classificationsToInclude: null
          packageNameMasksToExclude: null
          packageNameMasksToInclude: null
        }
        rebootSetting: 'IfRequired'
        windowsParameters: {
          classificationsToInclude: [
            'Critical'
            'Security'
          ]
          kbNumbersToExclude: null
          kbNumbersToInclude: null
        }
      }
    }
  }
]
